/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package analiseSintatica.Regras.Blocos;

import AnaliseLexicaFinal.EstruturaDeDados.LinkToken;
import analiseSintatica.ErroSintaticoException;
import analiseSintatica.Regras.Regra;
import analiseSintatica.estruturadados.NoArvore;
import java.util.LinkedList;

/**
 *
 * @author amferraz
 */
public class RegraDiretivas extends Regra {

    protected static Regra instancia;

    protected String estrutura = "{include '<' identificador '.' identificador '>'}";

    /**
     * Construtor do singleton
     */
    private RegraDiretivas() {
    }

    /**
     * Retorna a unica instancia dessa classe.
     * @return
     */
    public static RegraDiretivas getInstance() {
        if (instancia == null) {
            instancia = new RegraDiretivas();
        }
        return (RegraDiretivas) instancia;

    }

    @Override
    public NoArvore analisar(LinkedList<LinkToken> listaTokens) throws ErroSintaticoException {
    	NoArvore terminalDiretivas = new NoArvore("<diretivas>", false);
   	
    	while(listaTokens.getFirst().getToken().equals("include")){
    		
    		terminalDiretivas.adicionaFilho(reconheceToken(listaTokens, "include", estrutura));
    		
    			
    		try {
    			terminalDiretivas.adicionaFilho(reconheceLexema(listaTokens, "operador_relacional", "<", estrutura));
    		} catch (ErroSintaticoException e) {
    			e.printStackTrace();
		   }
    		
    		try {
    			terminalDiretivas.adicionaFilho(reconheceToken(listaTokens, "identificador", estrutura));
    		} catch (ErroSintaticoException e) {
    			e.printStackTrace();
		   }
    		
    		try {
    			terminalDiretivas.adicionaFilho(reconheceLexema(listaTokens, "delimitador", ".", estrutura));
    		} catch (ErroSintaticoException e) {
    			e.printStackTrace();
		   }
       
	    	try {
				terminalDiretivas.adicionaFilho(reconheceToken(listaTokens, "identificador", estrutura));
			} catch (ErroSintaticoException e) {
				e.printStackTrace();
		   }
    	
			try {
				terminalDiretivas.adicionaFilho(reconheceLexema(listaTokens, "operador_relacional", ">", estrutura));
			} catch (ErroSintaticoException e) {
				e.printStackTrace();
		   }
	}
		
       
       return terminalDiretivas;
    }

    @Override
    protected void setPrimeiro() {
//        this.primeiro = new LinkedList<String>();
        this.primeiro.add("include");
        this.primeiro.add("e");
    }

    @Override
    protected void setSeguinte() {
        this.seguinte.add("typedef");
        this.seguinte.add("const");
        this.seguinte.add("char");
        this.seguinte.add("int");
        this.seguinte.add("float");
        this.seguinte.add("boolean");
        this.seguinte.add("void");
        this.seguinte.add("identificador");

//        this.seguinte  = this.getPrimeiro();
//        this.seguinte.remove("e");
//        this.seguinte = getUniao(seguinte, RegraDeclsInicial.getInstance().getPrimeiro());
//        this.seguinte.remove("e");
//        this.seguinte = getUniao(seguinte, "void");
    }
}
